package vaccine.appointment.system.common.utils;

import cn.hutool.core.util.CharsetUtil;
import cn.hutool.crypto.digest.DigestAlgorithm;
import cn.hutool.crypto.digest.Digester;
import cn.hutool.crypto.symmetric.SymmetricAlgorithm;
import cn.hutool.crypto.symmetric.SymmetricCrypto;

import java.nio.charset.StandardCharsets;
import java.util.UUID;

/**
 * 加密解密工具类
 */
public class EncryptionAndDecryptionUtil {
    //构建单例模式
    private EncryptionAndDecryptionUtil(){}

    //对称加密的密钥
    private static final byte[] key = "hri81s2f55nks42o".getBytes(StandardCharsets.UTF_8);

    /**
     * 使用 摘要算法 MD5 进行加密
     * @param content 待加密的内容
     * @return 加密过后的字符串
     */
    public static String encryptByDigester(String content) {
        //生成随机盐值
        String salt = String.valueOf(UUID.randomUUID()).replace("-","");

        //MD5 算法对内容进行加密
        Digester digester = new Digester(DigestAlgorithm.MD5);
        String digestHex = digester.digestHex(content);

        //将盐值拼接到用户的密码中，再次加密形成最终的密文
        String ret = digester.digestHex(digestHex + salt);

        return salt + ret;
    }

    /**
     * 使用摘要算法进行密码的验证
     * @param content 待验证的数据
     * @param sqlEncrypt 数据库的密文
     * @return boolean类型
     */
    public static boolean decryptByDigester(String content, String sqlEncrypt) {
        //MD5 算法对内容进行加密
        Digester digester = new Digester(DigestAlgorithm.MD5);
        String ret = digester.digestHex(content);

        //获取盐值
        String salt = sqlEncrypt.substring(0, 32);

        //用户的密文
        String client = salt + digester.digestHex(ret + salt);

        //验证
        return sqlEncrypt.equals(client);
    }

    /**
     * AES 对称加密
     * @param content 待加密的数据
     * @return 密文
     */
    public static String encryptByAES(String content) {
        SymmetricCrypto aes = new SymmetricCrypto(SymmetricAlgorithm.AES, key);

        //加密
        byte[] encrypt = aes.encrypt(content);

        return aes.encryptHex(encrypt);
    }

    /**
     * 对称加密的解密
     * @param sqlDecrypt 数据库的密文
     * @return 解密过后的字符串
     */
    public static String decryptByAES(String sqlDecrypt) {
        SymmetricCrypto aes = new SymmetricCrypto(SymmetricAlgorithm.AES, key);

        //解密
        byte[] decrypt = aes.decrypt(sqlDecrypt);
        String decryptStr = aes.decryptStr(decrypt, CharsetUtil.CHARSET_UTF_8);

        return decryptStr;
    }
}
